一、实验题目
二叉树基本操作的编程实现
二、题目要求
二叉树基本操作的编程实现,掌握二叉树的建立、遍历、插入、删除等基本操作的编程实现,也可以进一步编程实现查找等操作,存储结构主要采用顺序或链接结构。也鼓励学生利用基本操作进行一些应用的程序设计。
三、运行结果
四、程序基本功能
1、先根递归遍历(DLR)
若二叉树为空,遍历结束。否则,先访问根结点;然后先根遍历根结点的左子树;再先根遍历根结点的右子树。
2、中根递归遍历(LDR)
若二叉树为空,遍历结束。否则,先进行中根遍历根结点的左子树;再访问根结点;再中根遍历根结点的右子树。
3、后根递归遍历(LRD)
若二叉树为空,遍历结束。否则,先进行后根遍历根结点的左子树;再后根遍历根结点的右子树;再访问根结点。
4、先根非递归遍历
二叉树以二叉链表存放,一维数组stack[maxsize]用以实现栈,变量top用来表示当前栈顶的位置。
5、中根非递归遍历
二叉树以二叉链表存放,一维数组stack[maxsize]用以实现栈,变量top用来表示当前栈顶的位置。
6、后根非递归遍历
由于必须先把两个孩子都访问完毕,才可以访问“根”,为了保留返回地址,所以必然进栈两次,但并不是任何结点总有两个孩子,所以无法准确判断当前栈顶是左孩子还是右孩子,解决的方法有两种,一是启用两个栈,分别处理。二是约定结点要入两次栈,出两次栈,而访问结点是在第二次出栈时访问。因此,为了区别同一个结点指针的两次出栈,设置一标志flag=1,令flag=1代表第一次出栈,结点不能访问,flag=2代表第二次出栈,结点可以访问,当结点指针进、出栈时,其标志flag也同时进、出栈。因此,可将栈中元素的数据类型定义为指针和标志flag合并。定义如下:
Class stackdata //创建一个stackdata类,在非递归遍历算法中需要
{
friend class btree;
private:
node *link;
int flag;
public:
stackdata() {
} ;
~stackdata() {
};
};
7、层次遍历
二叉树的层次遍历是指从二叉树的第一层开始,从上至下逐层遍历,在同一层中,则按从左到右的顺序对结点逐个访问。
五、部分源码
这次实验相对于来说有点困难,所以老师直接给了我们源代码
/*
需要把所有遍历的函数补上,确保功能正确。
自己需要画至少四层的二叉树,然后手工写出各种遍历结果,
然后用计算机建立相应的二叉树,通过程序看看结果是否一样&